﻿
'use strict';
if (typeof nw === 'object') {	// nwjs 入口
    nw.Window.open ('index.html',
	{
	    width: 800,
	    height: 600
	}
	, function (win){});
} else {	// electron 入口

    // electron 不自动设定 js 所在目录为当前工作目录，需要手动设定
    if (typeof __dirname === 'string') // 此处可省略这个判断。但若在
				       // index.html 里面使用，则必须有这个
				       // 判断，因为 nw 的 html 环境未定义
				       // 变量 __dirname
	process.chdir(__dirname);

    const { app, BrowserWindow, ipcMain, dialog } = require('electron');

    // 找到的禁用 sandbox 的代码, 备用
    // run this at early startup, before app.on('ready')
    //if (app.commandLine && app.commandLine.hasSwitch)
    //	if (! app.commandLine.hasSwitch('no-sandbox'))
    //	    app.commandLine.appendSwitch('no-sandbox');

    ipcMain.on('quit-app', (event, args) => {
	//app.quit();	// 这句不能成功退出软件, 可能是因为 app.quit()
			// 只是继续发送 close 事件而已, 而 close 事件的默认
			// 动作可能已经被 event.preventDefault() 阻止。
	app.exit();	// 貌似改为 app.exit() 就对了
	//process.exit(); // 如果只使用 app.quit(), 则需要这句才能真正退出
    });

    ipcMain.on('quit-guest', (event, id) => {
	//const webContents = event.sender;
	//const win = BrowserWindow.fromWebContents(webContents);
	if (global.Pal && global.Pal[id] && global.Pal[id].win)
	    global.Pal[id].win.destroy();
    });

    ipcMain.on('show-guest', (event, id) => {
	//const webContents = event.sender;
	//const win = BrowserWindow.fromWebContents(webContents);
	if (global.Pal && global.Pal[id] && global.Pal[id].win) {
	    global.Pal[id].win.showInactive();
	    global.Pal[id].win.moveTop();
	}
    });

    ipcMain.on('set-title', (event, title) => {
	const webContents = event.sender;
	const win = BrowserWindow.fromWebContents(webContents);
	if (win)
	    win.setTitle(title);
    });

    let path = require('path');

    function createWindow () {
	// 创建浏览器窗口
	const win = new BrowserWindow({
	    width: 800,
	    height: 600,
	    autoHideMenuBar: true,
	    icon: path.join (__dirname, 'js', 'miao.png'),
	    webPreferences: {
		//preload: path.join(__dirname, 'preload.js'),
		//由于 contextIsolation 为 false, 因此不需要 preload.js。
		//如果要使用 preload.js, 其内容如下(删除每行开头的两个斜杠):
		////////////开始 preload.js
		//const { contextBridge, ipcRenderer } = require('electron');
		//
		//	//contextBridge.exposeInMainWorld('electronAPI', {
		//	//	quitApp: () => ipcRenderer.send('quit-app')
		//	//});
		//
		//window.electronAPI = {
		//	quitApp: () => ipcRenderer.send('quit-app')
		//};
		////////////结束 preload.js
		contextIsolation: false,
		enableRemoteModule: true,
		nodeIntegration: true,
		nativeWindowOpen: true
	    }
	});

	global.Pal = {};

// 从 electron-v22.0.0 开始, new-window 事件已被废弃
if (typeof win.webContents.setWindowOpenHandler === 'function') {
	win.webContents.setWindowOpenHandler((details) => {
	    return {
		action: 'allow',
		overrideBrowserWindowOptions: {
			autoHideMenuBar: true,
			show: false,
		}
	    }
	});

	win.webContents.on('did-create-window', (guestWin, { frameName }) => {
		if (! global.Pal[frameName])
		    global.Pal[frameName] = {};
		global.Pal[frameName].win = guestWin;
		guestWin.once('ready-to-show', () => {
		    guestWin.showInactive();
		});
		guestWin.on('close', (e) => {
		    e.preventDefault();
		    //guestWin.destroy();
		    //因 remote 模块被废弃, 改用 IPC 方式
		    //监听消息的代码不是在 guestWin 中, 向它发消息是无效的:
		    //guestWin.webContents.send('close-guest',FrameName);
		    //监听消息的代码是在主窗口中, 因此应该向 win 发消息:
		    win.webContents.send('close-guest', frameName);
		});
	});
} else {
	win.webContents.on('new-window', function
	    (event, url, frameName, disposition, options, additionalFeatures) {
		//xxx += 100;
		//yyy += 100;
	    //if (frameName === 'modal') {
		event.preventDefault();
		Object.assign(options, {
		    autoHideMenuBar: true,
		    show: false,
		//    modal: false,
		//    parent: win,
		//    width: xxx,
		//    height: yyy
		});
		event.newGuest = new BrowserWindow(options);
		if (! global.Pal[frameName])
		    global.Pal[frameName] = {};
		//event.newGuest.setTitle('url=' + url + '=' + frameName);
		global.Pal[frameName].win = event.newGuest;
		event.newGuest.once('ready-to-show', () => {
		    event.newGuest.showInactive();
		});
		event.newGuest.on('close', (e) => {
		    e.preventDefault();
		    //event.newGuest.destroy();
		    //因 remote 模块被废弃, 改用 IPC 方式
		    //监听消息的代码不是在 newGuest 中, 向它发消息是无效的
		    //event.newGuest.webContents.send('close-guest',FrameName);
		    //监听消息的代码是在主窗口中, 因此应该向 win 发消息
		    win.webContents.send('close-guest', frameName);
		});
	    //}
	});
}

//	win.webContents.on('will-prevent-unload', (event) => {
//	    const choice = dialog.showMessageBoxSync(win, {
//		type: 'question',
//		buttons: ['Leave', 'Stay'],
//		title: 'Do you want to leave this site?',
//		message: 'Changes you made may not be saved.',
//		defaultId: 0,
//		cancelID: 1
//	    });
//	    const leave = (choice === 0);
//	    if (leave) {
//		event.preventDefault();
//	    }
//	});

	// 加载index.html文件
	win.loadFile('index.html');
	win.on('close', (event) => {
	    if (win) {
		//主进程必须有这一句，否则渲染进程中的 close 事件处理程序
		//捕获不到 close 事件。
		event.preventDefault();
		//因 remote 模块被废弃, 改用 IPC 方式
		win.webContents.send('close-app');
	    }
	});
    }

    //const os = require("os");
    //const isWin7 = os.release().startsWith('6.1');
    //if (isWin7) {
	//win7下 ，关闭硬件加速
	app.disableHardwareAcceleration();
    //}

    app.whenReady().then(createWindow);

    // 下面这段代码似乎可有可无
    // Quit when all windows are closed.
    app.on('window-all-closed', () => {
	// 在 macOS 上，除非用户用 Cmd + Q 确定地退出，
	// 否则绝大部分应用及其菜单栏会保持激活。
	if (process.platform !== 'darwin') {
	    app.quit();
	}
    });
}

